package com.tedu.springboot2302.controller;

import com.tedu.springboot2302.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * @author Huangjin
 * @version 1.0
 * describe:当前类用于处理与用户相关的业务
 * @date 2023/3/17 10:12
 */
@Controller
public class UserController {
    private static File userDir;
    static {
        userDir = new File("./users");
        if(!userDir.exists()){
            userDir.mkdirs();
        }
    }
    @RequestMapping("/regUser")//保证与表单上的值一致
    public void reg(HttpServletRequest request, HttpServletResponse response){
         /*
            HttpServletRequest称为请求对象,内容表达的是浏览器发送过来的所有数据
            HttpServletResponse称为响应对象,内容表达的是我们处理完业务后给浏览器回复的内容

            处理业务的大致过程:
            1:通过请求对象获取浏览器发送过来的信息(比如表单中用户输入的注册信息)
            2:通过获取的信息进行响应的业务处理
            3:通过设置响应对象将处理结果回馈给浏览器
         */
        System.out.println("开始处理用户注册！！！");
        //获取表单提交的信息
        /*
            getParameter中的参数要与页面上表单中对应输入框的名字一致
            例如:
             String username = request.getParameter("username");
                                                     ^^^^^^^^
             应当对应的是reg.html页面上
             <input type="text" name="username">
                                      ^^^^^^^^
         */
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String nickname = request.getParameter("nickname");
        String age = request.getParameter("age");
        /*System.out.println("username:"+username);
        System.out.println("password:"+password);
        System.out.println("nickname:"+nickname);
        System.out.println("age:"+age);*/
        //对浏览器提交的数据进行验证
        if (username==null||username.isEmpty()||
                password==null||password.isEmpty()||
                nickname==null||nickname.isEmpty()||
                age==null||age.isEmpty()||
                !age.matches("[0-9]+")){
            //直接给一个相应错误的页面
            try {
                response.sendRedirect("/reg_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;//跳到这里便不再执行
        }


        int ageStr = Integer.parseInt(age);
        User user = new User(username,password,nickname,ageStr);
        //第一个参数的File对象表示当前文件在哪个目录中
        File file = new File(userDir,username+".obj");
        //首先判断改文件是否已经存在，存在则说明此为重复用户
        if (file.exists()) {
            try {
                response.sendRedirect("/have_user.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        try (FileOutputStream fos = new FileOutputStream(file);
             ObjectOutputStream oos = new ObjectOutputStream(fos);)
        {
            oos.writeObject(user);
            response.sendRedirect("/reg_success.html");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //验证通过后将该用户信息保存在服务端
    }

    @RequestMapping("loginUser")
    public void login(HttpServletRequest request,HttpServletResponse response){
        System.out.println("开始处理用户注册！！！");
        //通过request获取表单提交的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //对浏览器提交的数据进行验证
        if (username==null||username.isEmpty()||
                password==null||password.isEmpty()){
            //直接给一个相应错误的页面
            try {
                response.sendRedirect("/login_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;//跳到这里便不再执行
        }

        //读取users目录下对用的用户文件（反序列化）
        File file = new File("users/"+username+".obj");

        if(file.exists()){//文件存在则说明该用户注册过
            //反序列化该文件并得到曾经该用户的注册信息
            try (
                    FileInputStream fis = new FileInputStream(file);
                    ObjectInputStream ois = new ObjectInputStream(fis);
            ){
                //从文件中反序列化回来的对象,应当是上面reg方法曾经保存的该用户的注册信息
                User user = (User)ois.readObject();
                //比较注册时输入的密码与本次登录时输入的密码是否一致
                if(user.getPassword().equals(password)){
                    //密码一致则表示登录成功
                    response.sendRedirect("/login_success.html");
                }else{
                    //登录失败
                    response.sendRedirect("/login_fail.html");
                }
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }


        }else{//文件不存在说明这不是一个注册用户
            try {
                response.sendRedirect("/login_fail.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}
